
package com.pronosticnews.client.admin.activity;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.activity.shared.AbstractActivity;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.place.shared.PlaceController;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import com.pronosticnews.client.admin.ClientFactory;
import com.pronosticnews.client.admin.view.editChampionnat.EditChampionnatView;
import com.pronosticnews.client.admin.view.editChampionnat.EditChampionnatView.Presenter;
import com.pronosticnews.client.event.DeletedChampionnatEvent;
import com.pronosticnews.client.event.DeletedChampionnatEventHandler;
import com.pronosticnews.client.event.InformationMessageEvent;
import com.pronosticnews.client.event.NouveauChampionnatEvent;
import com.pronosticnews.client.event.SelectedChampionnatEvent;
import com.pronosticnews.client.event.SelectedChampionnatEventHandler;
import com.pronosticnews.client.services.ChampionnatService;
import com.pronosticnews.client.services.ChampionnatServiceAsync;
import com.pronosticnews.client.services.PaysService;
import com.pronosticnews.client.services.PaysServiceAsync;
import com.pronosticnews.client.services.SportService;
import com.pronosticnews.client.services.SportServiceAsync;
import com.pronosticnews.client.util.InformationMessage;
import com.pronosticnews.client.util.InformationMessage.TYPE_MESSAGE;
import com.pronosticnews.shared.model.ChampionnatDto;
import com.pronosticnews.shared.model.PaysDto;
import com.pronosticnews.shared.model.SportDto;

import fr.ysa.services.config.ConfigRequetesDto;
import fr.ysa.services.config.TrieDto;
import fr.ysa.services.config.TrieDto.ORDRE;

public class EditChampionnatActivity extends AbstractActivity implements
		Presenter {

	private EditChampionnatView view;

	private PlaceController placeController;

	private ChampionnatServiceAsync championnatService;

	private SportServiceAsync sportService;

	private PaysServiceAsync paysService;

	private AsyncCallback<ChampionnatDto> saveCallBack;

	private AsyncCallback<List<PaysDto>> getPaysCallBack;

	private AsyncCallback<List<SportDto>> getSportCallBack;

	private EventBus eventBus;

	private ChampionnatDto existingChampionnat;

	private ConfigRequetesDto configGetPays;

	private ConfigRequetesDto configGetSports;

	public EditChampionnatActivity(ClientFactory clientFactory) {
		championnatService = GWT.create(ChampionnatService.class);
		sportService = GWT.create(SportService.class);
		paysService = GWT.create(PaysService.class);
		placeController = clientFactory.getPlaceController();
		view = clientFactory.getEditChampionnatView();
		view.setPresenter(this);
		eventBus = clientFactory.getEventBus();
		addEvents();
		view.setModeModification(false);

	}

	private void addEvents() {

		eventBus.addHandler(SelectedChampionnatEvent.TYPE,
				new SelectedChampionnatEventHandler() {

					@Override
					public void onSelect(SelectedChampionnatEvent event) {
						existingChampionnat = event.getChampionnatSelected();
						view.setModeModification(true);
						view.setChampionnat(existingChampionnat);
					}
				});

		eventBus.addHandler(DeletedChampionnatEvent.TYPE,
				new DeletedChampionnatEventHandler() {

					@Override
					public void onDelete(DeletedChampionnatEvent event) {
						existingChampionnat = null;
						view.setModeModification(false);
					}
				});
	}

	@Override
	public void start(AcceptsOneWidget panel,
			com.google.gwt.event.shared.EventBus eventBus) {
		panel.setWidget(view.asWidget());
		getPays();
		getSports();
	}

	@Override
	public void submit(ChampionnatDto editChampionnat) {
		if (saveCallBack == null) {
			saveCallBack = new AsyncCallback<ChampionnatDto>() {

				@Override
				public void onSuccess(ChampionnatDto result) {
					InformationMessage messageSuccess = new InformationMessage();
					messageSuccess.setType(TYPE_MESSAGE.SUCCESS);
					List<String> messages = new ArrayList<String>();
					messages.add("Le championnat a été/modifié créé avec succès !");
					messageSuccess.setText(messages);
					view.submitComplete();
					eventBus.fireEvent(new NouveauChampionnatEvent());
					eventBus.fireEvent(new InformationMessageEvent(
							messageSuccess));
					existingChampionnat = null;
				}

				@Override
				public void onFailure(Throwable caught) {
					InformationMessage erreur = new InformationMessage();
					List<String> messages = new ArrayList<String>();
					messages.add(caught.getMessage());
					erreur.setText(messages);
					erreur.setType(TYPE_MESSAGE.ERROR);
					eventBus.fireEvent(new InformationMessageEvent(erreur));
				}
			};
		}

		if (existingChampionnat != null) {
			existingChampionnat.setNom(editChampionnat.getNom());
			championnatService.modifier(existingChampionnat, saveCallBack);
		} else {
			championnatService.sauvegarder(editChampionnat, saveCallBack);
		}
	}

	@Override
	public void annuleModification() {
		existingChampionnat = null;
	}

	@Override
	public void getPays() {
		if (getPaysCallBack == null) {
			getPaysCallBack = new AsyncCallback<List<PaysDto>>() {

				@Override
				public void onSuccess(List<PaysDto> result) {
					view.setPays(result);

				}

				@Override
				public void onFailure(Throwable caught) {
					InformationMessage erreur = new InformationMessage();
					erreur.setType(TYPE_MESSAGE.WARNING);
					List<String> messages = new ArrayList<String>();
					messages.add(caught.getMessage());
					erreur.setText(messages);
					eventBus.fireEvent(new InformationMessageEvent(erreur));
				}
			};
		}
		if (configGetPays == null) {
			configGetPays = new ConfigRequetesDto();
			TrieDto trieAsc = new TrieDto();
			trieAsc.setOrdre(ORDRE.ASC);
			trieAsc.setChamp(PaysDto.VALUE_NAME.nom.name());
			configGetPays.getTries().add(trieAsc);
		}
		paysService.trouver(configGetPays, getPaysCallBack);
	}

	@Override
	public void getSports() {
		if (getSportCallBack == null) {
			getSportCallBack = new AsyncCallback<List<SportDto>>() {

				@Override
				public void onSuccess(List<SportDto> result) {
					view.setSport(result);
				}

				@Override
				public void onFailure(Throwable caught) {
					InformationMessage erreur = new InformationMessage();
					erreur.setType(TYPE_MESSAGE.WARNING);
					List<String> messages = new ArrayList<String>();
					messages.add(caught.getMessage());
					erreur.setText(messages);
					eventBus.fireEvent(new InformationMessageEvent(erreur));
				}
			};
		}
		if (configGetSports == null) {
			configGetSports = new ConfigRequetesDto();
			TrieDto trieAsc = new TrieDto();
			trieAsc.setOrdre(ORDRE.ASC);
			trieAsc.setChamp(SportDto.VALUE_NAME.nom.name());
			configGetSports.getTries().add(trieAsc);
		}
		sportService.trouver(configGetSports, getSportCallBack);
	}

}
